package com.tistory.admin.common;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * Context용 ThreadLocal
 * 
 * @author 기반기술교육팀
 * 
 */
public final class ContextThreadLocal {

	private ContextThreadLocal() {
	}

	// 전역변수
	private static final ThreadLocal<Map<String, Object>> threadLocal = new ThreadLocal<Map<String, Object>>() {
		@Override
		public Map<String, Object> initialValue() {
			return new HashMap<String, Object>();
		}
	};

	/**
	 * key 값으로 저장된 object를 가져온다.
	 * 
	 * @param key
	 *            key값
	 * @return key 값으로 저장된 object
	 */
	public static Object get(String key) {
		return threadLocal.get().get(key);
	}

	/**
	 * key 값으로 object를 저장한다.
	 * 
	 * @param key
	 *            key값
	 * @param value
	 *            저장할 값
	 */
	public static void set(String key, Object value) {
		threadLocal.get().put(key, value);
	}

	/**
	 * key 값으로 저장된 object를 삭제한다.
	 * 
	 * @param key
	 *            key값
	 */
	public static void remove(String key) {
		threadLocal.get().remove(key);
	}

	/**
	 * key 값으로 저장된 object가 존재하는지 여부를 확인한다.
	 * 
	 * @param key
	 *            key값
	 * @return key 값으로 저장된 object 존재여부
	 */
	public static boolean containsKey(String key) {
		return threadLocal.get().containsKey(key);
	}

	/**
	 * 내부 참조 데이터를 모두 제거한다.
	 */
	public static void clear() {
		threadLocal.get().clear();
	}

	/**
	 * 저장된 key값의 목록을 얻는다.
	 * 
	 * @return key값 목록
	 */
	public static List<String> getKeyList() {

		Set<String> keySet = threadLocal.get().keySet();

		List<String> result = new ArrayList<String>();

		for (String key : keySet) {
			result.add(key);
		}

		return result;

	}

}
